home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / timer.c < prev    next >
C/C++ Source or Header  |  1989-01-13  |  2KB  |  98 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "timer.h"
  4.  
  5. /* Head of running timer chain */
  6. struct timer *timers;
  7.  
  8. tick()
  9. {
  10.     register struct timer *t,*tp;
  11.     register struct timer *expired = NULLTIMER;
  12.     char i_state;
  13.  
  14.     /* Run through the list of running timers, decrementing each one.
  15.      * If one has expired, take it off the running list and put it
  16.      * on a singly linked list of expired timers
  17.      */
  18.     i_state = disable();
  19.     for(t = timers;t != NULLTIMER; t = tp){
  20.         tp = t->next;
  21.         if(tp == t){
  22.             restore(i_state);
  23.             printf("PANIC: Timer loop at %lx\n",(long)tp);
  24.             iostop();
  25.             exit(1);
  26.                 }
  27.         if(t->state == TIMER_RUN && --(t->count) == 0){
  28.             stop_timer(t);
  29.             t->state = TIMER_EXPIRE;
  30.             /* Put on head of expired timer list */
  31.             t->next = expired;
  32.             expired = t;
  33.         }
  34.     }
  35.     restore(i_state);
  36.     /* Now go through the list of expired timers, removing each
  37.      * one and kicking the notify function, if there is one
  38.      */
  39.     /* Note: the check for TIMER_EXPIRE below has a specific */
  40.     /* purpose.  It prevents wasted timer calls to the NET/ROM */
  41.     /* transport protocol timeout routine.  This routine does */
  42.     /* not know which timer expired, so it scans and processes */
  43.     /* the whole window.  If multiple timers expired, it handles */
  44.     /* them all and resets their states to something other than */
  45.     /* TIMER_EXPIRE.  So, we oblige here by not re-processing */
  46.     /* them under those circumstances. */
  47.     
  48.     while((t = expired) != NULLTIMER){
  49.         expired = t->next;
  50.         if(t->state == TIMER_EXPIRE && t->func){
  51.             (*t->func)(t->arg);
  52.         }
  53.     }
  54. }
  55. /* Start a timer */
  56. start_timer(t)
  57. register struct timer *t;
  58. {
  59.     char i_state;
  60.  
  61.     if(t == NULLTIMER || t->start == 0)
  62.         return;
  63.     i_state = disable();
  64.     t->count = t->start;
  65.     if(t->state != TIMER_RUN){
  66.         t->state = TIMER_RUN;
  67.         /* Put on head of active timer list */
  68.         t->prev = NULLTIMER;
  69.         t->next = timers;
  70.         if(t->next != NULLTIMER)
  71.             t->next->prev = t;
  72.         timers = t;
  73.     }
  74.     restore(i_state);
  75. }
  76. /* Stop a timer */
  77. stop_timer(t)
  78. register struct timer *t;
  79. {
  80.     char i_state;
  81.  
  82.     if(t == NULLTIMER)
  83.         return;
  84.     i_state = disable();
  85.     if(t->state == TIMER_RUN){
  86.         /* Delete from active timer list */
  87.         if(timers == t)
  88.             timers = t->next;
  89.         if(t->next != NULLTIMER)
  90.             t->next->prev = t->prev;
  91.         if(t->prev != NULLTIMER)
  92.             t->prev->next = t->next;
  93.     }
  94.     t->state = TIMER_STOP;
  95.     restore(i_state);
  96. }
  97.  
  98.